上一篇文章,說明了什麼是mock,以及要如何區分stub和mock。這篇將會改寫我們LogAnalyzer。
我們要測試,是否LogAnalyzer首先我們需要修改我們的程式流程,從取得檔案名稱,衍生至從網站中上傳檔案,然後取得檔名,再檢查檔案名稱,當檔名正確,回傳為true,否則為false。
所以變成:
**網頁上傳 -->...--> 檢查檔名是否為log檔 --> true / false**
然後使用mock後,會變成:
*「製作出網頁上傳的檔案名稱」--> 檢查檔名是否為log檔 --> true / false**
首先我們先製作屬於我們的主要功能與程式(Day13_LogAnalyzer):
class Day13_LogAnalyzer
{
    private IWebService service;
    //structure: put the interface data to service.
    public Day13_LogAnalyzer(IWebService service)
    {
        this.service = service;
    }
    public void Analyze(string fileName)
    {
        if (!fileName.EndsWith(".log", StringComparison.CurrentCultureIgnoreCase))
        {
            service.LogMessage("false"); 
        }
        else
        {
            service.LogMessage("true");
        }
    }
}
#region Mock
//interface: Web service's message.
public interface IWebService
{
    void LogMessage(string message);
}
//A fake class.
public class FakeWebService : IWebService
{
    public string LastMessage;
    public void LogMessage(string message)
    {
        LastMessage = message;
    }
}
#endregion
interface(IWebService)裡面只有一個function。IWebService。這個就是我們的mock的皮,這個很像是之前的stub。但是他卻沒有回傳值,多了點額外的功能,所以視為mock。接著是測試的程式(Day13_LogAnalyzer_Test):
class Day13_LogAnalyzer_Test
{
    [Test]
    public void LogAnalyze_NameSupportedExtension_CallWebservice()
    {
        FakeWebService mokeSample = new FakeWebService();
        Day13_LogAnalyzer log = new Day13_LogAnalyzer(mokeSample);
        //log.Analyze("test_false.false");  //it will be error shows false
        log.Analyze("test_true.log");       //it will be ture shows true
        StringAssert.Contains("true", mokeSample.LastMessage);
    }
}
最後結果成功!!(可以是看看錯誤的,會有怎樣的錯誤訊息)
明天製作出Stub和Mock一起使用的案例。